#include "Global.h"
#include <cmath>


Global::t_maczar const Global::maczarData = {
    
    /* ----> gora wykroju - S60 */
    {
        {
            {-97.5, 0., 0.},
            {-97.5, 4., 20080.},
            {-92., 36.5, 13.1},
            {-59.2, 37.25, 3.},
            {-48.6, 8.25, 130007.},
            {-16.2, 8.25, 120.},
            {16.2, 8.25, 120120.},
            {48.2, 8.25, 7.},
            {63.8, 50.7, -40.},
            {66., 76.5, 4.},
            {77.5, 76.5, 2.},
            {77.5, 0., 0.},
            {0., 0., 0.},
            {0., 0., 0.},
            {0., 0., 0.},
            {0., 0., 0.},
            {0., 0., 0.}
        },

        /* ----> gora wykroju - S49 */
        {
            {-83.75, 0., 0.},
            {-83.75, 4., 20080.},
            {-77.25, 34., 13.},
            {-42.75, 35.7, 2.},
            {-33.15, 7.1, 130007.5},
            {-15.25, 7.1, 80.},
            {15.25, 7.1, 120120.},
            {42.3, 7.1, 7.5},
            {55.25, 44.6, -40.},
            {57.65, 64.6, 3.},
            {68.25, 64.6, 2.},
            {68.25, 0., 0.},
            {0., 0., 0.},
            {0., 0., 0.},
            {0., 0., 0.},
            {0., 0., 0.},
            {0., 0., 0.}
        }
    },

    /* ----> dol wykroju ( symetria wzgledem osi OX ) - S60 */
    {
        {
            {-97.5, 0., 0.},
            {-97.5, 4., 20080.},
            {-92., 36.5, 13.1},
            {-59.2, 37.25, 3.},
            {-48.6, 8.25, 130007.},
            {-16.2, 8.25, 120.},
            {16.2, 8.25, 120120.},
            {48.2, 8.25, 7.},
            {63.8, 50.7, -40.},
            {66., 76.5, 4.},
            {77.5, 76.5, 2.},
            {77.5, 0., 0.},
            {0., 0., 0.},
            {0., 0., 0.},
            {0., 0., 0.},
            {0., 0., 0.},
            {0., 0., 0.}
        },

        /* ----> dol wykroju ( symetria wzgledem osi OX ) - S49 */
        {
            {-83.75, 0., 0.},
            {-83.75, 4., 20080.},
            {-77.25, 34., 13.},
            {-42.75, 35.7, 2.},
            {-33.15, 7.1, 130007.5},
            {-15.25, 7.1, 80.},
            {15.25, 7.1, 120120.},
            {42.3, 7.1, 7.5},
            {55.25, 44.6, -40.},
            {57.65, 64.6, 3.},
            {68.25, 64.6, 2.},
            {68.25, 0., 0.},
            {0., 0., 0.},
            {0., 0., 0.},
            {0., 0., 0.},
            {0., 0., 0.},
            {0., 0., 0.}
        }
    },

    /* -----> podzial na elementy - preokreslenie */

    /* -----> szyna S60 */
    {
        {1., 1., 1., 2., 2., 2., .5, .5, 1.5, .5, .5, 1., 1.,
            1., 2., 2., 2., 2., 3., 3., 2., 2., 2., 2., 1., 1., .5, .5, 1.,
            1., 1., .5, .5, .5, 1., 1., .5, 0., 0., 0., 0., 0., 0., 0., 0.,
            0., 0., 0., 0., 0.},

        /* -----> szyna S49 */
        {1., 1., 1., 2., 2., 2., 2., 1., .5, .5, .5,
            .5, 1., 1., 2., 2., 2., 2., 3., 3., 2., 2., 2., 2., 1., 1., .5,
            .5, 1., 1., 1., .5, .5, .5, 1., 1., .5, 0., 0., 0., 0., 0., 0.,
            0., 0., 0., 0., 0., 0., 0.}
    },

    /* -----> szyna S60 */
    {
        {.5, 1., 1., 2., 2., 3., 3., 3., 3.,
            3., 3., 3., 3., 2., 2., 1., 1., .5, 0., 0., 0., 0., 0., 0., 0.,
            0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
            0., 0., 0., 0., 0., 0., 0., 0., 0.},


        /* -----> szyna S49 */
        {.5, 1., 1., 2., 2., 3., 3.,
            3., 3., 3., 3., 3., 3., 2., 2., 1., 1., .5, 0., 0., 0., 0., 0.,
            0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
            0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}
    },

    /* -----> punkty charakterystyczne */
    {-92., -80.25},
    {36.5, 34.},
    {-92., -80.25},
    {-36.5, -34.},
    {77.5, 68.25},
    {74.5, 62.6},
    {77.5, 68.25},
    {-74.5, -62.6},

    {12, 12},
    {12, 12},
    {38, 38},
    {19, 19}
};


/* ----> podprogram ma za zadanie rotacje ukladu wspolrzednych w ktorych */
/* ----> przedstawiono wektor v o pocztku (x1,y1) i koncu (x2,y2) w ten */
/* ----> sposob, aby w nowym ukladzie byl on poziomym wektorem o poczatku */
/* ----> (x1r,yr) i koncu (x2r,yr) */

int Global::rot(double *x, double *y, double sinfi, double cosfi)
{
    double x1 = *x * cosfi + *y * sinfi;
    double y1 = -(*x) * sinfi + *y * cosfi;
    *x = x1;
    *y = y1;
    return 0;
}


/* ---->  Program majacy za zadanie wyliczenie katow rozpoczecia (alp) */
/*        i zakonczenia (alk) luku o promieniu (r) i srodku (xr,yr) */
/*        przebiegajacego pomiedzy punktami (xp,yp) i (xk,yk) */
/*        a takze dlugosc linii od poczatku az do konca danego */
/*        luku (tpk). */

int Global::getalf(double xp, double yp, double xk,
            double yk, double r, double xr, double yr,
            double *alp, double *alk, double *tpk)
{
    //double pi = atan(1.) * 4.;
    double pi = M_PI;
    getfi(xp, yp, xr, yr, alp);
    getfi(xk, yk, xr, yr, alk);
    if (std::abs(*alk - *alp) > pi)
    {
        *alk -= pi * 2.;
    }
    if (std::abs(*alk - *alp) > pi)
    {
        *alk += pi * 4.;
    }
    *tpk = std::abs((*alk - *alp) * r);
    return 0;
}



/* ---->  Program majacy za zadanie wyliczenie kata fi dla punktu */
/*        (x,y) na luku o srodku (xr,yr) */

int Global::getfi(double x, double y, double xr, double yr, double *fi)
{

    //double pi = atan(1.) * 4.;
    double pi = M_PI;
    double dx = x - xr;
    double dy = y - yr;

    if (std::abs(dx) < 1e-10)
    {
        if (dy < 0.)
        {
            *fi = -pi / 2.;
        }
        else
        {
            *fi = pi / 2.;
        }
    }
    else
    {
        *fi = atan(dy / dx);
        if (dx < 0.)
        {
            *fi += pi;
        }
    }
    return 0;
}

